{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "20d09572",
   "metadata": {},
   "source": [
    "# numpy\n",
    "## data munging"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "75342cc9",
   "metadata": {},
   "source": [
    "### slicing\n",
    "1. indexing - take put\n",
    "2. reshape ravel flatten\n",
    "3. repeat tile\n",
    "4. newaxis"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "34ce3d4b",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[ 0,  1,  2,  3,  4],\n",
       "       [ 5,  6,  7,  8,  9],\n",
       "       [10, 11, 12, 13, 14],\n",
       "       [15, 16, 17, 18, 19]])"
      ]
     },
     "execution_count": 2,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "import numpy as np\n",
    "\n",
    "origin = np.arange(20).reshape(4,5)\n",
    "origin"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "783d46e7",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[ 0,  1,  2,  3,  4],\n",
       "       [ 5,  6,  7,  8,  9],\n",
       "       [10, 11, 12, 13, 14],\n",
       "       [15, 16, 17, 18, 19],\n",
       "       [ 0,  1,  2,  3,  4],\n",
       "       [ 5,  6,  7,  8,  9],\n",
       "       [10, 11, 12, 13, 14],\n",
       "       [15, 16, 17, 18, 19]])"
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "new1 = np.tile(origin,(2,1))\n",
    "new1"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "7f996f17",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[ 0,  0,  1,  1,  2,  2,  3,  3,  4,  4],\n",
       "       [ 5,  5,  6,  6,  7,  7,  8,  8,  9,  9],\n",
       "       [10, 10, 11, 11, 12, 12, 13, 13, 14, 14],\n",
       "       [15, 15, 16, 16, 17, 17, 18, 18, 19, 19]])"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "new2 = np.repeat(origin, 2, axis=1)\n",
    "new2"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "714f9cdc",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[ 0,  1,  2,  2,  3,  3,  3,  4,  4,  4,  4,  4],\n",
       "       [ 5,  6,  7,  7,  8,  8,  8,  9,  9,  9,  9,  9],\n",
       "       [10, 11, 12, 12, 13, 13, 13, 14, 14, 14, 14, 14],\n",
       "       [15, 16, 17, 17, 18, 18, 18, 19, 19, 19, 19, 19]])"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "new3 = origin.repeat([1,1,2,3,5],axis=1)\n",
    "new3"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "62d3d366",
   "metadata": {},
   "source": [
    "### broadcasting\n",
    "1. concatenate()\n",
    "2. vstack( ) r_[ ]\n",
    "3. hstack( ) c_[ ]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "id": "d09fdc8a",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "left:\n",
      "[[-0.49347223 -0.04229612 -0.46430637  0.94713139]\n",
      " [-2.02723765  0.79982769  2.85313599  1.49222266]\n",
      " [ 0.70760634  0.11182728 -1.38599835  1.44227297]]\n",
      "right:\n",
      "[[-0.33633902  0.83727346]\n",
      " [ 1.57925918  0.43832995]\n",
      " [-0.02801835 -0.72786918]]\n",
      "[[-0.49347223 -0.04229612 -0.46430637  0.94713139 -0.33633902  0.83727346]\n",
      " [-2.02723765  0.79982769  2.85313599  1.49222266  1.57925918  0.43832995]\n",
      " [ 0.70760634  0.11182728 -1.38599835  1.44227297 -0.02801835 -0.72786918]]\n"
     ]
    }
   ],
   "source": [
    "left = np.random.randn(3,4)\n",
    "right = np.random.randn(3,2)\n",
    "print(\"left:\\n{}\".format(left))\n",
    "print(\"right:\\n{}\".format(right))\n",
    "res1 = np.hstack((left, right))\n",
    "print(res1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "id": "85baed91",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(3, 6)\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "array([[-0.49347223, -0.04229612, -0.46430637,  0.94713139, -0.33633902,\n",
       "         0.83727346],\n",
       "       [-2.02723765,  0.79982769,  2.85313599,  1.49222266,  1.57925918,\n",
       "         0.43832995],\n",
       "       [ 0.70760634,  0.11182728, -1.38599835,  1.44227297, -0.02801835,\n",
       "        -0.72786918]])"
      ]
     },
     "execution_count": 20,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "res2 = np.concatenate((left, right),axis=1)\n",
    "print(res2.shape)\n",
    "res2"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "id": "6985ccb6",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(3, 6)\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "array([[-0.49347223, -0.04229612, -0.46430637,  0.94713139, -0.33633902,\n",
       "         0.83727346],\n",
       "       [-2.02723765,  0.79982769,  2.85313599,  1.49222266,  1.57925918,\n",
       "         0.43832995],\n",
       "       [ 0.70760634,  0.11182728, -1.38599835,  1.44227297, -0.02801835,\n",
       "        -0.72786918]])"
      ]
     },
     "execution_count": 22,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "res3 = np.c_[left,right]\n",
    "print(res3.shape)\n",
    "res3"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "id": "13025c49",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[[-2.02893689e-01,  1.87431883e-01,  6.08574143e-01,\n",
       "         -3.13107266e-01,  1.36942776e+00],\n",
       "        [-6.58057520e-01, -3.59245482e-01, -7.27640940e-01,\n",
       "         -1.08069111e+00,  2.33616121e+00],\n",
       "        [ 2.18659639e+00, -2.89378600e-01, -8.31419200e-01,\n",
       "         -1.41305542e+00,  1.01177448e+00],\n",
       "        [ 2.25346806e-01,  9.20551929e-01,  5.04677687e-01,\n",
       "         -1.85988747e+00, -4.89489339e-01]],\n",
       "\n",
       "       [[-1.33296091e-01, -5.96694467e-04, -7.23443800e-01,\n",
       "          3.97172115e-01,  7.43700033e-01],\n",
       "        [-1.55176902e+00, -1.94036220e+00,  9.14550164e-01,\n",
       "          1.23654369e-01, -2.81515068e-01],\n",
       "        [ 2.93467864e-02, -4.31175283e-01, -1.40841096e-01,\n",
       "          6.76596083e-01,  3.96583655e-01],\n",
       "        [ 1.58617315e-01, -5.75623805e-01, -3.16658686e-01,\n",
       "          1.11625228e-01, -1.19426156e+00]],\n",
       "\n",
       "       [[-1.67253422e-01,  1.15270292e+00, -1.15626035e-01,\n",
       "         -4.01755268e-02, -3.60458175e-01],\n",
       "        [ 5.59003466e-01,  9.18066943e-01, -3.54566739e-01,\n",
       "          1.42230587e+00,  5.23965318e-01],\n",
       "        [-7.59686595e-01, -8.39934080e-01, -1.33633501e+00,\n",
       "          2.01120405e+00,  1.37433865e+00],\n",
       "        [ 6.50804594e-01, -6.15364854e-01,  5.31215092e-01,\n",
       "          2.16494981e+00,  1.38000622e-02]]])"
      ]
     },
     "execution_count": 23,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# calculate mean over 2th axis\n",
    "num = np.random.randn(60).reshape(3,4,5)\n",
    "num"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "id": "8449bd12",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(3, 4)\n",
      "[[[-0.53278025 -0.14245468  0.27868758 -0.64299383  1.03954119]\n",
      "  [-0.56016275 -0.26135071 -0.62974617 -0.98279634  2.43405598]\n",
      "  [ 2.05369286 -0.42228213 -0.96432273 -1.54595895  0.87887095]\n",
      "  [ 0.36510688  1.06031201  0.64443777 -1.72012739 -0.34972926]]\n",
      "\n",
      " [[-0.1900032  -0.05730381 -0.78015091  0.340465    0.68699292]\n",
      "  [-1.00468067 -1.39327385  1.46163851  0.67074272  0.26557328]\n",
      "  [-0.07675524 -0.53727731 -0.24694313  0.57049405  0.29048163]\n",
      "  [ 0.52187762 -0.2123635   0.04660162  0.47488553 -0.83100126]]\n",
      "\n",
      " [[-0.26109137  1.05886496 -0.20946399 -0.13401348 -0.45429613]\n",
      "  [-0.05475151  0.30431197 -0.96832171  0.8085509  -0.08978965]\n",
      "  [-0.849604   -0.92985148 -1.42625241  1.92128664  1.28442124]\n",
      "  [ 0.10172365 -1.16444579 -0.01786585  1.61586887 -0.53528088]]]\n"
     ]
    }
   ],
   "source": [
    "mean = num.mean(axis=2)\n",
    "print(mean.shape)\n",
    "demean = num - mean[:,:,np.newaxis]\n",
    "print(demean)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "aee4c51c",
   "metadata": {},
   "source": [
    "### built-in ufunc\n",
    "运算符重载 x+y = np.add(x,y)<br>\n",
    "[reduce, accumulate, outer(x,y), reduceat(x,bins,axis)]\n",
    "1. add.reduce = sum\n",
    "2. logical_and.reduce = all\n",
    "3. add.accumulate = cumsum"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 35,
   "id": "0d9b5048",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "45"
      ]
     },
     "execution_count": 35,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "dome = np.arange(10)\n",
    "rome = np.add.reduce(dome)\n",
    "rome"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 44,
   "id": "2d20ac1f",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[[ True  True  True  True]\n",
      " [ True False  True False]\n",
      " [ True  True  True  True]\n",
      " [False False  True False]\n",
      " [ True  True  True  True]]\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "array([ True, False,  True, False,  True])"
      ]
     },
     "execution_count": 44,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "dome2 = np.random.randn(5,5)\n",
    "dome2[::2].sort(axis=1)\n",
    "print(dome2[:,:-1]<dome2[:,1:])\n",
    "rome2 = np.logical_and.reduce(dome2[:,:-1]<dome2[:,1:],axis=1)\n",
    "rome2"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "f54090b5",
   "metadata": {},
   "source": [
    "### write own ufunc\n",
    "1. frompyfunc(unfunc-like function, elements) -> the output is a numpy object\n",
    "2. vectorize(unfunc-like function,otype)\n",
    "3. shortcoming: much more slower than built-in ufun"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "e211feee",
   "metadata": {},
   "source": [
    "## more structure"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "13200dc0",
   "metadata": {},
   "source": [
    "### dtype\n",
    "1. tuple symbolizes (name,data type, repeat time)\n",
    "2. could reach data via name"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 48,
   "id": "ade341d0",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([([0., 0., 0.], 0), ([0., 0., 0.], 0), ([0., 0., 0.], 0),\n",
       "       ([0., 0., 0.], 0)], dtype=[('x', '<f8', (3,)), ('y', '<i4')])"
      ]
     },
     "execution_count": 48,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# sample for a thorough usage of numpy ndarray\n",
    "dtype = [('x',np.float64, 3),('y',np.int32)]\n",
    "samp = np.zeros(4,dtype = dtype)\n",
    "samp"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 49,
   "id": "e814bb34",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[1., 3., 2.],\n",
       "       [2., 4., 8.]])"
      ]
     },
     "execution_count": 49,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "samp2 = np.array([([1,3,2],5),([2,4,8],10)],dtype=dtype)\n",
    "samp2['x']"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 50,
   "id": "080b6566",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([1., 3., 2.])"
      ]
     },
     "execution_count": 50,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "samp2[0]['x']"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "624d8409",
   "metadata": {},
   "source": [
    "## sort function\n",
    "1. [ndarray].sort() is a inplace sort\n",
    "2. np.sort() will create a new ndarry \n",
    "3. [ndarray].argsort() will return an index array"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 62,
   "id": "1fa8a99f",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[ 1.        ,  4.        ,  3.        ,  2.        ,  0.        ],\n",
       "       [ 3.15807477,  1.55778388, -0.30698746, -0.74257675, -0.19980926],\n",
       "       [ 1.8513698 ,  1.25486481, -0.55407361, -0.56133136,  0.13183761]])"
      ]
     },
     "execution_count": 62,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "arr = np.random.randn(3,5)\n",
    "sand = [1,4,3,2,0]\n",
    "arr[0,:] = sand\n",
    "arr"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 63,
   "id": "471eb769",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[ 0.        ,  1.        ,  2.        ,  3.        ,  4.        ],\n",
       "       [-0.19980926,  3.15807477, -0.74257675, -0.30698746,  1.55778388],\n",
       "       [ 0.13183761,  1.8513698 , -0.56133136, -0.55407361,  1.25486481]])"
      ]
     },
     "execution_count": 63,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "arr[:, arr[0,:].argsort()]"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "8839eddc",
   "metadata": {},
   "source": [
    "## structural changes\n",
    "1. reshape( )\n",
    "2. transpose( ) T\n",
    "3. swapaxes( )"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "3c983167",
   "metadata": {},
   "source": [
    "## np.meshgrid\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 130,
   "id": "275453d8",
   "metadata": {},
   "outputs": [],
   "source": [
    "import matplotlib as mpl\n",
    "from matplotlib import pyplot as plt\n",
    "import numpy as np\n",
    "\n",
    "def add_box(ax):\n",
    "    '''用红框标出一个ax的范围.'''\n",
    "    axpos = ax.get_position()\n",
    "    rect = mpl.patches.Rectangle(\n",
    "        (axpos.x0, axpos.y0), axpos.width, axpos.height,\n",
    "        lw=3, ls='--', ec='r', fc='none', alpha=0.5,\n",
    "        transform=ax.figure.transFigure\n",
    "    )\n",
    "    ax.patches.append(rect)\n",
    "    \n",
    "def add_right_cax(ax, pad, width):\n",
    "    '''\n",
    "    在一个ax右边追加与之等高的cax.\n",
    "    pad是cax与ax的间距.\n",
    "    width是cax的宽度.\n",
    "    '''\n",
    "    axpos = ax.get_position()\n",
    "    caxpos = mpl.transforms.Bbox.from_extents(\n",
    "        axpos.x1 + pad,\n",
    "        axpos.y0,\n",
    "        axpos.x1 + pad + width,\n",
    "        axpos.y1\n",
    "    )\n",
    "    cax = ax.figure.add_axes(caxpos)\n",
    "\n",
    "    return cax"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 136,
   "id": "c2a29e54",
   "metadata": {},
   "outputs": [],
   "source": [
    "# prepare raw data\n",
    "points = np.arange(-5,5,0.01)\n",
    "xs, ys = np.meshgrid(points, points)\n",
    "zs = np.sqrt(xs**2 + ys**2)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "7fee4d19",
   "metadata": {},
   "source": [
    "### some interfaces\n",
    "1. figure.colorbar(im,ax|cax,orientation,ticks,lable)\n",
    "2. matplotlib - cm.ScalarMappable(norm, cmap)\n",
    "3. matplotlib - colors.Normalize colors.LogNorm colors.BoundaryNorm\n",
    "4. matplotlib - cm.[ ]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 139,
   "id": "4e223147",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<matplotlib.image.AxesImage at 0x7f8d45c87dc0>"
      ]
     },
     "execution_count": 139,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAk0AAAG1CAYAAADk08CxAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8qNh9FAAAACXBIWXMAAA9hAAAPYQGoP6dpAACX1UlEQVR4nO29e7gcVZ3u/67qvbMTtgn3XHBIAsFIiMLMhJtAchQjoONwUUf5CQGfMTJndDwDySAc4mWMxnMeAhhHkBD0PBMQUSYicpHIAfMA8UwiAsFxEDMwBswo4aKQsCHZu7vW7491qbVWrequ7uzOriTvh6foqlWrLl3dnXr3+/2ub4mBgQEJQgghhBDSlGSkT4AQQgghZHeAookQQgghpAQUTYQQQgghJaBoIoQQQggpAUUTIYQQQkgJKJoIIYQQQkpA0UQIIYQQUgKKJkIIIYSQElA0EUIIIYSUgKKJkN2EdevWYcmSJXjllVe6dowVK1bg5ptv7tr+CSFkd4aiiZDdhHXr1uErX/kKXn311a4dY8WKFbjlllu6tn9CCNmdoWgihBBCCCkBRRMhuwFLlizBokWLAABHHXUU+vv70d/fj4ceeggAsGrVKrzrXe/CwQcfjPHjx+PMM8/Ehg0bvH385je/wYUXXohp06Zh//33x9SpU/G+970PTzzxBABgxowZ+NWvfoWHH37Y7n/GjBm79H0SQkiV6RnpEyCEtOZjH/sY/vjHP+L666/HrbfeiokTJwIAjjzySCxduhRf/OIXMW/ePFx22WUYHBzEsmXLcNppp+HBBx+0wucDH/gAGo0GvvzlL+PQQw/Fyy+/jHXr1tlw36233orzzz8f48aNw7JlywAAo0aNGpH3SwghVUQMDAzIkT4JQkhrli1bhkWLFuHJJ5/ElClTAACbN2/GzJkz8YlPfAJXXXWV7fvaa6/h6KOPximnnIKbbroJL7/8MiZPnowrr7wSn/rUpwqPceyxx+Kggw7C6tWru/5+CCFkd4NOEyG7Mffffz/q9To++tGPol6v2/bRo0dj9uzZePDBBwEABxxwAA4//HAsW7YMjUYDc+bMwdFHH40kYYSeEELKwn8xCdmNeeGFFwAAs2fPxr777utNq1atwssvvwwAEELgnnvuwdy5c/HVr34VJ598MqZMmYJ/+Id/wLZt20byLRBCyG4DnSZCdmMOPPBAAMAtt9yCyZMnN+07efJkXH/99QCA//iP/8Dtt9+OJUuWYHBwEP/0T//U9XMlhJDdHYomQnYT+vr6AABvvPGGbZs7dy56enrwn//5nzj77LNL7+stb3kLLrvsMtxxxx3eKLu+vj5v/4QQQjIomgjZTZg5cyYA4Bvf+AbOO+889Pb24i1veQs++9nP4otf/CI2bdqE97znPdhvv/3wwgsv4Oc//zn6+/vx2c9+Fv/2b/+GhQsX4pxzzsG0adMwatQoPPjgg/jlL3+JhQsXesdYtWoVVq1ahcMOOwx9fX1429veNlJvmRBCKgVHzxGyG/GFL3wBt9xyC7Zs2YI0TXHvvfdizpw5uPvuu3Hddddhw4YN2LFjByZMmIBZs2bh4x//ON71rnfhhRdewOc+9zk88sgj2Lx5M4QQmDp1KubNm4e//du/Ra1WAwA899xz+Lu/+zv87Gc/w7Zt2zB58mT86le/GuF3TQgh1YCiiRBCCCGkBBw9RwghhBBSAoomQgghhJASUDQRQgghhJSAookQQgghpAQUTYQQQgghJaBoIoQQQggpAUUTIYQQQkgJKJoIIYQQQkpA0UQIIYQQUgKKJkIIIYSQElA0EUIIIYSUgKKJEEIIIaQEFE2EEEIIISWgaCKEEEIIKQFFEyGEEEJICSiaCCFkN2bdunVYsmQJXnnlla4dY8WKFbj55pu7tn9CdhcomgghZDdm3bp1+MpXvoJXX321a8dYsWIFbrnllq7tn5DdBYomQgghhJASUDQRQshuypIlS7Bo0SIAwFFHHYX+/n709/fjoYceAgCsWrUK73rXu3DwwQdj/PjxOPPMM7FhwwZvH7/5zW9w4YUXYtq0adh///0xdepUvO9978MTTzwBAJgxYwZ+9atf4eGHH7b7nzFjxi59n4RUhZ6RPgFCCCGd8bGPfQx//OMfcf311+PWW2/FxIkTAQBHHnkkli5dii9+8YuYN28eLrvsMgwODmLZsmU47bTT8OCDD1rh84EPfACNRgNf/vKXceihh+Lll1/GunXrbLjv1ltvxfnnn49x48Zh2bJlAIBRo0aNyPslZKQRAwMDcqRPghBCSGcsW7YMixYtwpNPPokpU6YAADZv3oyZM2fiE5/4BK666irb97XXXsPRRx+NU045BTfddBNefvllTJ48GVdeeSU+9alPFR7j2GOPxUEHHYTVq1d3/f0QUmXoNBFCyB7G/fffj3q9jo9+9KOo1+u2ffTo0Zg9ezYefPBBAMABBxyAww8/HMuWLUOj0cCcOXNw9NFHI0mYuUFIDP4yCCFkD+OFF14AAMyePRv77ruvN61atQovv/wyAEAIgXvuuQdz587FV7/6VZx88smYMmUK/uEf/gHbtm0bybdASCWh00QIIXsYBx54IADglltuweTJk5v2nTx5Mq6//noAwH/8x3/g9ttvx5IlSzA4OIh/+qd/6vq5ErI7QdFECCG7MX19fQCAN954w7bNnTsXPT09+M///E+cffbZpff1lre8BZdddhnuuOMOb5RdX1+ft39C9lYomgghZDdm5syZAIBvfOMbOO+889Db24u3vOUt+OxnP4svfvGL2LRpE97znvdgv/32wwsvvICf//zn6O/vx2c/+1n827/9GxYuXIhzzjkH06ZNw6hRo/Dggw/il7/8JRYuXOgdY9WqVVi1ahUOO+ww9PX14W1ve9tIvWVCRgyOniOEkN2cL3zhC7jllluwZcsWpGmKe++9F3PmzMHdd9+N6667Dhs2bMCOHTswYcIEzJo1Cx//+Mfxrne9Cy+88AI+97nP4ZFHHsHmzZshhMDUqVMxb948/O3f/i1qtRoA4LnnnsPf/d3f4Wc/+xm2bduGyZMn41e/+tUIv2tCdj0UTYQQQgghJeDoOUIIIYSQElA0EUIIIYSUgKKJEEIIIaQEFE2EEEII6ZilS5di9uzZmDBhAqZMmYKPfOQj2Lhxo9fnoosusg98NtM73/nOlvu+4447MGvWLOy///6YNWsW7rzzzi69i3JQNBFCCCGkY9auXYuLLroIa9aswV133YV6vY4zzzwTAwMDXr/3vOc9eOaZZ+x0++23N93v+vXrccEFF+Dcc8/FunXrcO6552LevHl45JFHuvl2msLRc4QQQsgezPbt2zE4ONjWNlJKCCG8tr6+PltMtRkvvvgipk6dih//+Mc45ZRTACin6dVXX8X3vve90udwwQUXYOvWrbjjjjts21lnnYX99tsPK1euLL2f4aR0ccveJUtK9WvMno10zpz4wW64AeKll8oe0t/vrFlIzzgjuq52881Innuuo/2mRx6Jxgc/GN/v97+P5KmnOtvv5MlozJsXXZesXo3ao492tF950EGo/83fxPf70EOoPfxwZ/sdMwb1BQvi+/35z1H7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\n",
      "text/plain": [
       "<Figure size 640x480 with 5 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "fig,axes = plt.subplots(2,2,facecolor='whitesmoke',edgecolor='gray')\n",
    "fig.subplots_adjust(hspace=0.05, wspace=0.02)\n",
    "fig.suptitle(\"test\")\n",
    "\n",
    "norm = mpl.colors.Normalize(vmin=0, vmax=25)\n",
    "im = mpl.cm.ScalarMappable(norm = norm, cmap = mpl.cm.viridis)\n",
    "#im = axes[0,1].pcolormesh(xs,ys,zs, cmap=mpl.cm.viridis, shading='nearest')\n",
    "\n",
    "    \n",
    "# 提前用红框圈出每个ax的范围,并关闭刻度显示.\n",
    "for ax in axes.flat:\n",
    "    add_box(ax)\n",
    "    ax.axis('off')\n",
    "\n",
    "cax = add_right_cax(axes[0,1], pad=0, width=0.02)\n",
    "\n",
    "# set colorbar\n",
    "fig.colorbar(im, cax=cax, orientation='vertical', ticks=np.linspace(0,25,11,dtype=float),label=\"c\")\n",
    "axes[0,1].set_title('test')\n",
    "axes[0,1].imshow(zs)\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "77cd0f7c",
   "metadata": {},
   "source": [
    "## ternary\n",
    "1. python solution - x if condition else y\n",
    "2. numpy solution - np.where(condition, x, y)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 153,
   "id": "7b5f1c3b",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "arr_x:\n",
      " [[ 0.80763947]\n",
      " [-0.82698574]\n",
      " [ 0.86579424]]\n",
      " arr_y:\n",
      "[[ 0.08645953]\n",
      " [-1.11318431]\n",
      " [-1.93824737]]\n",
      "\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "[array([0.80763947]), array([-0.82698574]), array([0.86579424])]"
      ]
     },
     "execution_count": 153,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "arr_x = np.random.randn(3,1)\n",
    "arr_y = np.random.randn(3,1)\n",
    "print(\"arr_x:\\n {0}\\n arr_y:\\n{1}\\n\".format(arr_x, arr_y))\n",
    "cond1 = [(x > y) for x, y in zip(arr_x, arr_y)]\n",
    "res1 = [(x if c else y) for x,c,d in zip(arr_x,cond1,arr_y)]\n",
    "res1"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "4ea1f2c8",
   "metadata": {},
   "source": [
    "## statistic methods\n",
    "1. ndarray.mean = np.mean(arr)\n",
    "2. ndarray.sum = np.sum(arr)\n",
    "3. cumsum cumprod\n",
    "4. std var\n",
    "5. min max\n",
    "6. argmin argmax"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 156,
   "id": "00094719",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0.0029283999373880807\n",
      "0.0029283999373880807\n"
     ]
    }
   ],
   "source": [
    "exp_arr = np.random.randn(4,5)\n",
    "print(np.average(exp_arr))\n",
    "print(exp_arr.mean())"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "b518f3d7",
   "metadata": {},
   "source": [
    "## matrix methods\n",
    "numpy.linalg<br>\n",
    "1. qr decomposition\n",
    "2. svd\n",
    "3. eig\n",
    "4. inv pinv\n",
    "5. det "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 230,
   "id": "fd257fea",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[1, 3, 2],\n",
       "       [6, 4, 7],\n",
       "       [3, 8, 5]])"
      ]
     },
     "execution_count": 230,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from numpy.linalg import qr, inv, eig, svd\n",
    "from numpy import linalg\n",
    "\n",
    "samp = np.array([[1,3,2],[6,4,7],[3,8,5]])\n",
    "samp"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "a01c0887",
   "metadata": {},
   "source": [
    "#### QR\n",
    "$$\n",
    "    A = QR, \n",
    "$$\n",
    "$Q$ is unit matrix and $R$ is upper triangle matrix"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 233,
   "id": "bfd7ccc0",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[[-0.14744196  0.33197886 -0.93169249]\n",
      " [-0.88465174 -0.46553358 -0.02588035]\n",
      " [-0.44232587  0.82040753  0.36232486]]\n",
      "[[-6.78232998 -7.51953976 -8.69907541]\n",
      " [ 0.          5.69706255  1.50726035]\n",
      " [ 0.          0.         -0.23292312]]\n",
      "9.000000000000014\n"
     ]
    }
   ],
   "source": [
    "q,r = qr(samp)\n",
    "print(q)\n",
    "print(r)\n",
    "print(np.linalg.det(r))"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "945a1e83",
   "metadata": {},
   "source": [
    "#### EVD\n",
    "$$ \n",
    "    P^{-1} \\Lambda P = B\n",
    "$$\n",
    "$$\n",
    "\\lambda, p = np.linalg.eig(matrix)\n",
    "$$"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 236,
   "id": "fd76f498",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "p:\n",
      " [[-0.2658066  -0.68140931  0.2196581 ]\n",
      " [-0.66458531 -0.20052395 -0.75038694]\n",
      " [-0.69833603  0.70389737  0.62343385]]\n",
      "lambda : \n",
      "[13.75524391 -0.18316975 -3.57207416]\n",
      "det:\n",
      "8.99999999999998\n"
     ]
    }
   ],
   "source": [
    "# EVD process\n",
    "lam, p = eig(samp)\n",
    "print(\"p:\\n {0}\".format(p))\n",
    "print(\"lambda : \\n{0}\".format(lam))\n",
    "\n",
    "res0 = 1\n",
    "for i in lam:\n",
    "    res0 *= i\n",
    "print(\"det:\\n{0}\".format(res0))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 218,
   "id": "d3e962d7",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[1., 3., 2.],\n",
       "       [6., 4., 7.],\n",
       "       [3., 8., 5.]])"
      ]
     },
     "execution_count": 218,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "revamp = np.dot(np.dot(p, np.diag(lam)), np.linalg.inv(p))\n",
    "revamp"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 237,
   "id": "d75317e6",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "det:8.99999999999998\n"
     ]
    }
   ],
   "source": [
    "interdet = np.linalg.det(p)\n",
    "interdet_inv = np.linalg.det(np.linalg.inv(p))\n",
    "ortho = np.linalg.det(np.diag(lam))\n",
    "\n",
    "print(\"det:{0}\".format(interdet* interdet_inv * ortho))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 224,
   "id": "eb5138b2",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "9.000000000000005"
      ]
     },
     "execution_count": 224,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.linalg.det(samp)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "0d6348ec",
   "metadata": {},
   "source": [
    "#### numpy: trace diag\n",
    "1. these two methods just return uncalculated elements \n",
    "2. nothing was involved in the EVD process"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 229,
   "id": "757208a3",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "diagnal elements are: [1 8 5]\n",
      "trace result is: 14\n"
     ]
    }
   ],
   "source": [
    "print(\"diagnal elements are: {0}\".format(np.diag(samp)))\n",
    "print(\"trace result is: {0}\".format(np.trace(samp)))"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "23b8e935",
   "metadata": {},
   "source": [
    "## random generator\n",
    "numpy random"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "c4dcfba4",
   "metadata": {},
   "source": [
    "### create rng\n",
    "1. rng = np.random.RandomState(seed)\n",
    "2. np.random.seed(seed) will only alter a global rng"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "d43f75cb",
   "metadata": {},
   "source": [
    "### methods\n",
    "1. rand() - uniform\n",
    "2. randn() - normal distribution\n",
    "3. randint() - range\n",
    "<hr>\n",
    "1. binomial() \n",
    "2. <font color=red> normal(loc= ,scale= ,size= ())</font>\n",
    "3. beta()\n",
    "4. chisquare()\n",
    "5. gamma()\n",
    "6. uniform()\n",
    "<hr>\n",
    "1. permutation - sequence, return new\n",
    "2. shuffle - sequence, in-place"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 243,
   "id": "6023494a",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[0. , 0.5, 1. , 1.5, 2. ],\n",
       "       [2.5, 3. , 3.5, 4. , 4.5],\n",
       "       [5. , 5.5, 6. , 6.5, 7. ],\n",
       "       [7.5, 8. , 8.5, 9. , 9.5]])"
      ]
     },
     "execution_count": 243,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from numpy import random\n",
    "\n",
    "pamp = np.arange(0,10,0.5).reshape(4,5)\n",
    "pamp"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 244,
   "id": "3bec43b7",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[2.5, 3. , 3.5, 4. , 4.5],\n",
       "       [7.5, 8. , 8.5, 9. , 9.5],\n",
       "       [5. , 5.5, 6. , 6.5, 7. ],\n",
       "       [0. , 0.5, 1. , 1.5, 2. ]])"
      ]
     },
     "execution_count": 244,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "random.permutation(pamp)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "5877f15d",
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "python3.6",
   "language": "python",
   "name": "python3.6"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.9.7"
  },
  "toc": {
   "base_numbering": 1,
   "nav_menu": {},
   "number_sections": true,
   "sideBar": true,
   "skip_h1_title": false,
   "title_cell": "Table of Contents",
   "title_sidebar": "Contents",
   "toc_cell": false,
   "toc_position": {
    "height": "calc(100% - 180px)",
    "left": "10px",
    "top": "150px",
    "width": "281.195px"
   },
   "toc_section_display": true,
   "toc_window_display": true
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
